package utils

import (
	"errors"
	"fmt"
	"io"
	"log"
	"mime/multipart"
	"net/http"
	"os"
	"path/filepath"

	"github.com/google/uuid"
	"github.com/lunny/axmlParser"
)

/*
multipart格式数据保存到本地

Return:
  - 文件本地地址
  - 文件名
  - 错误
*/
func SaveToLocalFile(fileHeader multipart.FileHeader) (string, string, error) {
	file, err := fileHeader.Open()
	if err != nil {
		// 处理错误
		return "", "", err
	}
	defer file.Close()

	// 读取文件内容
	fileBytes, err := io.ReadAll(file)
	if err != nil {
		// 处理错误
		return "", "", err
	}
	// 生成一个新的文件名称
	fileName := uuid.New().String() + "_" + fileHeader.Filename
	dir, _ := os.Getwd()
	filePath := filepath.Join(dir, "temp", fileName)
	// 文件夹不存在创建
	err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
	if err != nil {
		fmt.Println(err)
		return "", "", errors.New("创建文件夹失败")
	}
	// 写入文件
	err = os.WriteFile(filePath, fileBytes, 0644)
	if err != nil {
		// 处理错误
		return "", "", err
	}
	return filePath, fileName, nil
}

// 上传文件到文件服务
func UploadFile(multiFile multipart.FileHeader) string {
	filePath, fileName, err := SaveToLocalFile(multiFile)
	if err != nil {
		panic(err)
	}
	params := map[string]string{}
	objectName := fileName
	path := GetFileUrl(objectName)
	return PostFormFile(path, params, "object", filePath)
}

// 文件名称已经大小
func GetFileNameAndSize(filePath string) (string, int64) {
	// 文件名称
	fileName := filepath.Base(filePath)
	// 文件大小
	fileInfo, err := os.Stat(filePath)
	if err != nil {
		log.Fatal(err)
	}

	return fileName, fileInfo.Size()
}

// 通过链接下载文件到本地
func DownloadToLocalFile(url, fileType string) (string, bool) {
	// 发起 HTTP GET 请求并获取响应
	resp, err := http.Get(url)
	if err != nil {
		log.Println("无法发起 HTTP 请求:", err)
		return "", false
	}
	defer resp.Body.Close()

	// 检查响应状态码是否为 200 OK
	if resp.StatusCode != http.StatusOK {
		log.Println("下载失败:", resp.Status)
		return "", false
	}

	// 创建本地文件
	filePath, _ := GetTempFile(fileType)
	file, err := os.Open(filePath)
	if err != nil {
		log.Println("文件打开失败:", err)
	}
	defer file.Close()

	// 将 HTTP 响应的 Body 写入本地文件
	_, err = io.Copy(file, resp.Body)
	if err != nil {
		log.Println("写入文件失败:", err)
		return "", false
	}

	return filePath, true
}

// 创建本地临时文件
func GetTempFile(sufffix string) (string, bool) {
	// 创建本地文件
	fileName := uuid.New().String() + "." + sufffix
	dir, _ := os.Getwd()
	filePath := filepath.Join(dir, "temp", fileName)
	file, err := os.Create(filePath)
	if err != nil {
		log.Println("无法创建本地文件:", err)
		return "", false
	}
	defer file.Close()
	return filePath, true
}

// 删除文件
func DeleteFile(filePath string) {
	err := os.Remove(filePath)
	if err != nil {
		fmt.Println("文件删除失败")
		return
	}
	fmt.Println("文件删除成功")
}

// 获取apk文件的版本名称和版本号
func GetApkVersion(filePath string) (string, string) {
	listener := new(axmlParser.AppNameListener)
	axmlParser.ParseApk(filePath, listener)
	return listener.VersionName, listener.VersionCode

}
